package cn.chenhao.user.service.impl;

import cn.chenhao.basic.exception.BusinessException;
import cn.chenhao.basic.util.StrUtils;
import cn.chenhao.user.constant.UserConstant;
import cn.chenhao.user.domain.User;
import cn.chenhao.user.mapper.UserMapper;
import cn.chenhao.user.service.IVerifyCodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@Service
public class VerifyCodeServiceImpl implements IVerifyCodeService {

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private RedisTemplate redisTemplate;


    @Override
    public void sendSmsCode(Map<String,String> params) {
        String phone = params.get("phone");
        String type = params.get("type");

        // 一：校验
        // 1.手机号是否为空
        if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(type) ){
            throw new BusinessException("请正确输入账户信息！");
        }
        String businessKey = "";
        if("register".equals(type)){//注册逻辑
            // 2.手机号是否已注册 通过查询t_user表
            User user = userMapper.loadByPhone(phone);
            if(user != null){
                throw new BusinessException("该号码已经被注册，请直接登录或找回密码！");
            }
            businessKey =  UserConstant.BUSINESS_REGISTER_PREFIX + phone;
        }else if("binder".equals(type)){
            businessKey =  UserConstant.BUSINESS_BINDER_PREFIX + phone;
        }
        if(StringUtils.hasLength(businessKey)){
            sendCode(businessKey);
        }

    }

    public void sendCode(String businessKey){
        // 二：判断验证码是否有效
        // 1.从redis中看是否能拿到key-business_register_prefix:13548344144
        Object codeTmp = redisTemplate
                .opsForValue()
                .get(businessKey);
        String code = "";
        // 2.如果能拿到，再需要判断是否过了1分钟的重复时间
        if (codeTmp != null) {
            String timeTem = codeTmp.toString().split(":")[1];// 得到时间戳
            // 3.如果没有没有过重复时间，则报错，并提示用户，勿重复点击
            if (System.currentTimeMillis() - Long.valueOf(timeTem) <= 1 * 60 * 1000) {// 判断是否小于1分钟
                throw new BusinessException("请勿重复点击获取！");// 不足一分钟，就提示用户
            } else {
                // 4.如果时间过了，则使用上次的验证码
                code = codeTmp.toString().split(":")[0];
            }
        } else {
            // 5.否则，如果拿不到，就直接生成新的4位验证码
            code = StrUtils.getComplexRandomString(4);
        }

        // 三：存储redis，将验证码过期时间设置为三分钟
        redisTemplate.opsForValue().set(
                businessKey,// key为前缀+手机号
                code + ":" + System.currentTimeMillis(),// value为验证码拼接时间戳
                3,// 设置过期时间为三分钟
                TimeUnit.MINUTES// 设置时间单位为【分】
        );

        // 四：发送验证码，并提醒用户，验证码将在三分钟后过期
        /*SendMsgUtil.send(phone, "您的验证码是：" + code + ",验证码将在3分钟后失效，请您尽快使用");*/
        System.out.println("您的验证码是：" + code + ",验证码将在3分钟后失效，请您尽快使用");
    }

}
